<?php
declare (strict_types=1);

namespace app\common\tool\WeChat;

use app\common\tool\WeChat\Exception\WeChatException;
use WeChat\Oauth;
use WeChat\Template;

class WeChat
{

    /**
     * @var mixed 微信配置参数
     */
    protected $config;

    public function __construct()
    {
        $this->config = config('pay')['wechat'];
    }

    /**
     * 设置配置信息
     * @param array $config 配置内容
     * @return $this
     */
    public function withConfig(array $config): self
    {
        $this->config = $config;
        return $this;
    }

    /**
     * @param $redirect_url
     * @param $state
     * @param $scope - 授权类类型(可选值snsapi_base - 获取openid用|snsapi_userinfo - 获取微信用户信息用)
     * @return string
     * @throws WeChatException
     * 原点 2022年12月8日15:38:24 微信公众号授权跳转接口
     */
    public function getOauthRedirect($redirect_url, $state = '', $scope = 'snsapi_base')
    {
        try {
            return Oauth::instance($this->config)->getOauthRedirect($redirect_url, $state, $scope);
        } catch (\Exception $e) {
            throw new WeChatException('加载失败：' . $e->getMessage(), -1);
        }
    }


    /**
     * @param $code
     * @return array
     * @throws WeChatException
     * 原点 2022年12月8日15:40:15 获取openid,静默授权(需getOauthRedirect方法scope需为 snsapi_base)
     */
    public function getOauthAccessToken($code)
    {
        try {
            return Oauth::instance($this->config)->getOauthAccessToken($code);
        } catch (\Exception $e) {
            throw new WeChatException('加载失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * @param $access_token
     * @param $openid
     * @param $lang
     * @return array
     * @throws WeChatException
     * 原点 2022年12月8日15:43:21 拉取用户信息(需getOauthRedirect方法scope需为 snsapi_userinfo)
     */
    public function getUserInfo($access_token, $openid, $lang = 'zh_CN')
    {
        try {
            return Oauth::instance($this->config)->getUserInfo($access_token, $openid, $lang);
        } catch (\Exception $e) {
            throw new WeChatException('获取失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * data 参数内容
     * 微信公众号发送消息模板
     * touser:接受消息模板用户
     * template_id:模板id
     * url:跳转路径
     * data:参数内容
     * miniprogram：[appid：小程序appid ；pagepath：小程序跳转路径]
     */
    public function wechatTemplateSend($data)
    {
        try {
            return Template::instance($this->config)->send($data);
        } catch (\Exception $e) {
            throw new WeChatException('加载失败：' . $e->getMessage(), -1);
        }
    }

    //微信公众号获取模板列表
    public function getAllPrivateTemplate()
    {
        try {
            return Template::instance($this->config)->getAllPrivateTemplate();
        } catch (\Exception $e) {
            throw new WeChatException('加载失败：' . $e->getMessage(), -1);
        }
    }

}